HS 2025
LV-Leitung: Dr. Sandra Grinschgl / MSc. Aaron Friedli
Tutor: BSc. Lars Schilling
9. Einheit, 12.11.2025
Probleme beim Einlesen –> Keine NAs sondern nur leere Zellen –> Andere Funktionen als read_delim genutzt.
Effizienter Code Beispiel aus den Musterlösungen mit across()
Argument 1: cols = –> welche colums sollen bearbeitet werden
Argument 2: .fns 👉 Welche Funktion wenden wir auf die cols. an.
data_bfi_recoded <- clean_data_bfi_10 |>
mutate(
across(
c(bfi_extra_1_r, bfi_agree_2_r, bfi_consc_2_r, bfi_neuro_2_r, bfi_open_2_r),
~ case_when(
. == 1 ~ 5,
. == 2 ~ 4,
. == 3 ~ 3,
. == 4 ~ 2,
. == 5 ~ 1
)
)
)
#Sparsamere Alternative
data_bfi_recoded <- clean_data_bfi_10 |>
mutate(
across(ends_with("_r"), ~ 6 - .) # 6- Minus current Value .
)
data_bfi_recoded <- clean_data_bfi_10 |>
mutate(
across(ends_with("_r"), function(x) 6 - x) # Umgeschrieben
)Falls eure gerenderten Skripte bei den Peer-Partnern nicht richtig angezeigt werden 👉 Im Header des Quarto-Dokuments
embed-resources = true
Falls euch die dplyr() Funktionen zu Öde sind 😄genzplyr - Hadley Wickham
Wide: Jede Zeile bezieht sich auf eine Person und beinhaltet alle Messzeitpunkte
Long: Pro Messung (repeated measures) eine Zeile, Personen strecken sich über mehrere Zeilen hinweg.
👉 Long Format is häufig benötigt für Analysen mit einem repeated measures Faktor
Wie müssen wir den folgenden Datensatz transformieren, um ihn ins long Format zu bekommen?
| id | messzeitpunkt_t1 | messzeitpunkt_t2 | messzeitpunkt_t3 |
|---|---|---|---|
| 1 | 10 | 14 | 18 |
| 2 | 12 | 15 | 17 |
| 3 | 9 | 13 | 15 |
| 4 | 11 | 12 | 16 |
pivot_longer()Argumente:
cols 👉Welche Variablen sollen transformiert (also zusammengestapelt) werden?
names_to👉 Wie heisst die neue Variable, die den Messzeitpunkt (oder generell den ursprünglichen Spaltennamen) enthält?
values_to👉 Wie heisst die neue Variable, in der die Werte aus den ursprünglichen Spalten gespeichert werden?
pivot_wider()Argumente:
names_from 👉Die Werte aus dieser Spalte (messzeitpunkt) werden wieder zu Spaltennamen.
values_from👉Die Werte aus dieser Spalte (score) füllen die neu entstandenen Spalten.
pivot_longer() und pivot_wider() stammen aus dem Paket tidyr - Teil des tidyverse
Umgang mit fehlenden Werten: drop_na(), replace_na() stammen auch aus tidyr
aus Einführung in R, Kapitel 4.1
Code korrigieren / verbessern
Long Transformationen
Paket: psych
Schiefe / Skewness: Funktion skew()
Kurtosis / Wölbung: Funktion kurtosi()
Die Normalverteilung der Residuen ist eine Voraussetzung für viele statistische Tests.
Mögliche Arten, diese Annahme zu ueberprüfen:
Visuelle Verfahren (z.B. QQ-Plot)
Formale Tests (z. B. Shapiro-Wilk) –> “veraltete” Methode
Visuelle Verfahren werden heute meist bevorzugt, da sie weniger sensitiv gegenüber Stichprobengrössen sind.
Allerdings gilt: Verletzungen der Normalitätsannahme sind in der Praxis oft weniger problematisch als angenommen. Sollte es problematisch sein, kann auf nichtparametrische Verfahren ausgewichen werden.
Eine Residuum ist die Abweichung eines vorhergesagten Wertes vom tatsächlich beobachteten Wert. Der vorhergesagte Wert wurde dabei mithilfe eines mathematischen Modells ermittelt. Indem die Residuen minimiert werden, wird das Modell optimiert und es können genauere Vorhersagen getroffen werden. Im Gegensatz zu den Störgrößen sind Residuen (lateinisch residuum = „das Zurückgebliebene“) berechnete Größen und messen den vertikalen Abstand zwischen Beobachtungspunkt und der geschätzten Regressionsgerade.
Zweck: QQ-Plots prüfen, ob die Daten einer theoretischen Verteilung (z. B. Normalverteilung) folgen.
X-Achse: Theoretische Quantile
Y-Achse: Beobachtete (empirische) Datenquantile
Der QQ-Plot und das Histogramm zeigen, dass die Residuen insgesamt nahe an einer Normalverteilung liegen, jedoch im linken Extrembereich etwas mehr Werte (heavy tail) und im rechten Extrembereich etwas weniger Werte (light tail) aufweisen. Diese Abweichungen sind gering, sodass parametrische Analysen weiterhin angemessen sind.
Sollten in Abhängigkeit des Studiendesigns und der Fragestellungen in einer Präregistrierung oder einem Datenanalyseplan definiert werden.
z.B.:
Werte +/- 3 SD vom Gruppenmittelwert
Visuelle Ausreisser bei Boxplots und/oder Scatterplots
ABER: Nur weil ein Wert extrem aussieht sollte man den nicht unüberlegt entfernen! Mehr dazu in Leys et al. (2019)
Streudiagramme/Scatterplots
boxplot
Ein Ausreißer stammt vermutlich aus einer anderen Population und trägt daher nicht zu gültigen Schlussfolgerungen über die Zielpopulation bei, weshalb er grundsätzlich ausgeschlossen werden sollte. Extremwerte hingegen stammen aus derselben Population, sind lediglich sehr groß oder klein und dürfen daher nicht pauschal entfernt werden.
–> Beispiel: Pinguin wurde immer von menschen gefütteret und ist deswegen sehr dick –> andere Polulation als die Zielpopulation
#Mit psych Package
library(psych)
bfi_10_extra <- bfi_10_data |>
select(bfi_extra_1_r, bfi_extra_2)
alpha(bfi_10_extra, check.keys = TRUE)
Reliability analysis
Call: alpha(x = bfi_10_extra, check.keys = TRUE)
raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
0.76 0.76 0.62 0.62 3.2 0.085 3 1 0.62
95% confidence boundaries
lower alpha upper
Feldt 0.5 0.76 0.89
Duhachek 0.6 0.76 0.93
Reliability if an item is dropped:
raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bfi_extra_1_r 0.54 0.62 0.38 0.62 1.6 NA 0 0.62
bfi_extra_2 0.71 0.62 0.38 0.62 1.6 NA 0 0.62
Item statistics
n raw.r std.r r.cor r.drop mean sd
bfi_extra_1_r 29 0.89 0.9 0.71 0.62 3 1.1
bfi_extra_2 29 0.92 0.9 0.71 0.62 3 1.2
Non missing response frequency for each item
1 2 3 4 5 miss
bfi_extra_1_r 0.07 0.24 0.41 0.17 0.10 0.03
bfi_extra_2 0.10 0.28 0.28 0.21 0.14 0.03
splitHalf() aus dem psych Paket.Mehr Infos dazu: Psychometrics in R & Björn Walther
In diesem Beispiel werden nur zwei Items verwendet - wir gehen davon aus dass bfi_extra_1_r schon rekodiert wurde. Anonsten könnte man das auch im alpha befehl weiter spezifizieren.
Wide to long Transformationen gemacht - You mastered the tidyr!
Datenqualitätsindikatoren kennengelernt
References:
Wickham H (2025). genzplyr: dplyr but make it bussin fr fr no cap. R package version 0.0.0.9000, https://github.com/hadley/genzplyr.